import React, { useState } from 'react';
import { IpcResponse } from '../../../../shared/types';
import notificationService from '../../../services/notificationService';
import errorHandlerService from '../../../services/errorHandlerService';

/**
 * 自定义Hook，用于处理IPC计算请求
 * 
 * 该Hook提供了一个简单的方法来与Electron主进程通信并执行计算任务，
 * 同时处理加载状态和错误消息。
 */
export function useIpcCalculation() {
  const [loading, setLoading] = useState(false);

  /**
   * 执行计算的异步函数
   * 
   * @param calculationType - 计算类型标识符，用于确定要执行的计算方法
   * @param params - 传递给计算方法的参数对象
   * @param mapResult - 可选的回调函数，用于处理和转换计算结果，默认直接返回数据
   * @returns 返回一个Promise，包含计算结果或错误信息
   * 
   * @example
   * const { runCalculation } = useIpcCalculation();
   * const result = await runCalculation('demo-calculation', { a: 1, b: 2 });
   * if (result.success) {
   *   console.log(result.results);
   * }
   */
  const runCalculation = async (calculationType: string, params: any, mapResult: (data: any) => any = (d: any) => d) => {
    try {
      setLoading(true);
      
      // 验证IPC通信是否可用
      if (!window.electron || !window.electron.ipc || !window.electron.ipc.invoke) {
        throw new Error('IPC通信未正确初始化');
      }
      
      // 通过IPC调用主进程的perform-calculation方法
      const response: IpcResponse = await window.electron.ipc.invoke('perform-calculation', {
        calculationType,
        params,
      });

      // 处理成功的响应
      if (response.success) {
        // 使用mapResult函数处理结果数据
        const results = mapResult(response.data);
        notificationService.success('计算完成');
        // 返回处理后的结果以及原始数据作为回退
        return { success: true as const, results, rawData: response.data };
      }

      // 处理错误响应
      const errorMsg = response.error || '计算过程中发生错误';
      errorHandlerService.handleCalculationError(new Error(errorMsg));
      return { success: false as const, results: [] };
    } catch (err: any) {
      // 处理异常情况
      errorHandlerService.handleIpcError(err, 'perform-calculation');
      return { success: false as const, results: [] };
    } finally {
      // 无论成功或失败都清除加载状态
      setLoading(false);
    }
  };

  return { loading, runCalculation };
}

export default useIpcCalculation;